/*
Copyright (c) [2019年5月1日] [吴超]
[MBT_studio] is licensed under Mulan PSL v2.
You can use this software according to the terms and conditions of the Mulan PSL v2.
You may obtain a copy of Mulan PSL v2 at:
		 http://license.coscl.org.cn/MulanPSL2
THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
See the Mulan PSL v2 for more details.
*/
#include "stdafx.h"
#include "插件_节点构建.h"
#include "Context/数据创建销毁.h"

#include <物体/物体.h>


//S_节点构建参数* f_节点插件_节点模块构建参数(std::map<std::u16string, S_插件模块>& 模块, const std::u16string& name) {
//	S_插件模块 插件模块;
//	插件模块.m_Name = name;
//	插件模块.m_Type = E_扩展类型::e_扩展_节点;
//	插件模块.m_Object = (S_节点构建参数*)calloc(1, sizeof(S_节点构建参数));
//
//
//	模块[name] = 插件模块;
//
//	return (S_节点构建参数*)插件模块.m_Object;
//}


API_EXPORT S_设备环境& f_nodePlugin_get3D设备环境() {
	return API_EXPORT *S_节点框架::g_3D视口环境;
}

S_插件模块 f_nodePlugin_构建模块(const std::u16string& name, E_扩展类型 扩展类型, E_工作区类型 工作区) {

	S_插件模块 模块;
	模块.m_Name = name;
	模块.m_Type = 扩展类型;
	模块.m_注册工作区 = 工作区;

	switch (扩展类型) {
		case E_扩展类型::e_扩展_节点: {
			模块.m_Object = (S_节点构建参数*)calloc(1, sizeof(S_节点构建参数));
			break;
		}

		case E_扩展类型::e_扩展_物体构建: {
			模块.m_Object = (S_物体构建插件构建参数*)calloc(1, sizeof(S_物体构建插件构建参数));
			break;
		}

		case E_扩展类型::e_扩展_变换操作: {
			模块.m_Object = (S_变换操作插件构建参数*)calloc(1, sizeof(S_变换操作插件构建参数));
			break;
		}

		case E_扩展类型::e_扩展_场景更新: {
			模块.m_Object = (S_场景插件构建参数*)calloc(1, sizeof(S_场景插件构建参数));
			break;
		}
		default:
			break;
	}

	return 模块;
}





S_物体* f_nodePlugin_创建物体(S_设备环境& ctx, E_物体类型 类型) {
	S_物体* ob = f_ob_创建(ctx, 类型);
	f_node_构建物体模型(ob, ctx);

	f_node_物体添加到主场景(ob);
	f_node_物体添加到全局容器(ob);
	return ob;
}

void f_nodePlugin_销毁物体(S_物体* ob) {
	f_node_物体从主场景中移除(ob);
	f_node_从全局容器移除物体(ob);
	
	f_node_删除物体(ob);
}


S_Mesh* f_nodePlugin_物体添加网格(S_物体* ob, E_网格类型 类型) {
	S_设备环境& ctx = ob->m_变换矩阵.m_Buf->m_Ctx;
	auto* me = f_surface_创建网格对象(nullptr, ctx, ctx.m_支持光追, E_网格数据枚举::e_Mesh_Vulkan);

	uint32 loc = ob->m_DataNum;
	f_ob_set数据槽数量(ob, loc + 1);
	f_ob_set数据(ob, me, loc);

	switch (类型) {	
		case E_网格类型::e_mt_点: {
			f_ob_set材质(ob, f_NodeCtx_get基本光照点材质(), loc);
			break;
		}
		case E_网格类型::e_mt_面: {
			f_ob_set材质(ob, f_NodeCtx_get基本光照面材质(), loc);
			break;
		}
		case E_网格类型::e_mt_线段: {
			f_ob_set材质(ob, f_NodeCtx_get基本光照线段材质(), loc);
			break;
		}
		case E_网格类型::e_mt_连续线: {
			f_ob_set材质(ob, f_NodeCtx_get基本光照线材质(), loc);
			break;
		}
		default:
			break;
	}


	f_mesh_set绘制内存属性(f_ob_getMesh(ob, loc), {});
	return me;
}


API_EXPORT S_物体* f_nodePlugin_get激活物体() {
	return S_节点数据::g_激活物体;
}



//API_EXPORT S_Mesh* f_nodePlugin_创建预设网格(S_设备环境& ctx, E_预设网格 预设) {
//	S_Mesh* mesh = f_surface_创建网格对象(nullptr, ctx, ctx.m_支持光追, E_网格数据枚举::e_Mesh_Vulkan);
//
//	switch (预设) {
//		case E_预设网格::e_面:
//			break;
//		case E_预设网格::e_线段:
//			
//			break;
//		case E_预设网格::e_点:
//			break;
//		default:
//			break;
//	}
//	return mesh;
//}

void f_nodePlugin_物体销毁网格(S_物体* ob) {
	
}





API_EXPORT S_材质管线* f_nodePlugin_get预设材质(E_预设材质 预设) {
	switch (预设) {
		case E_预设材质::e_基本面光照:
			return f_NodeCtx_get基本光照面材质();
		case E_预设材质::e_线段:
			return f_NodeCtx_get基本光照线段材质();
		case E_预设材质::e_点:
			return f_NodeCtx_get基本光照点材质();
		default:
			break;
	}
	return nullptr;
}


